home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 1
/
Cream of the Crop 1.iso
/
PROGRAM
/
DBVGAL17.ARJ
/
SRC_C.ARJ
/
VESA8.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-01-26
|
8KB
|
224 lines
#define VESA8
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <alloc.h>
#include <mem.h>
#include <dos.h>
#include "vidlib.h"
#include "vesa.h"
int VESAfill256(unsigned dx, unsigned dy, unsigned sdx, unsigned sdy,
unsigned color)
{
char *dest;
int tempdx;
VESAsetpage(VESAwhat_page(dy, dx));
dest=(char *)normalize(_screen_start + VESAwhat_offset(dy,dx));
if (vgadebug) {
fprintf(vgadebug,"\nVESAfill256(dx=%u, %u, sdx=%u, sdy=%u, color=%u)\n",
dx,dy,sdx,sdy,color);
fflush(vgadebug);
}
while (sdy>0) {
while ((Vnext_break_row != dy) && (sdy>0)){
setmem(dest, sdx, color);
dy++; sdy--;
dest=(char *)normalize(dest+_screen_width);
}
if ((sdy>0) && (Vnext_break_row == dy)) {
tempdx=Vnext_break_col - dx; /* number of bytes */
if ( tempdx < 1 ) { /* no bytes to output on this page */
VESAsetpage(vesapage+1);
dest=(char *)normalize (_screen_start + VESAwhat_offset(dy,dx) );
setmem(dest, sdx, color);
dy++; sdy--;
continue;
}
if ( sdx > tempdx ) { /* split page */
setmem(dest, tempdx, color);
VESAsetpage(vesapage+1);
dest=(char *)normalize
(_screen_start + VESAwhat_offset(dy,dx+tempdx) );
setmem(dest, (sdx-tempdx), color);
} else { /* then all on this page */
setmem(dest, sdx, color);
VESAsetpage(vesapage+1);
}
dy++; sdy--;
dest=(char *)normalize(_screen_start + VESAwhat_offset(dy,dx));
}
}
return(1);
}
/* Currently, we assume the worst and perform all copies through system */
/* memory. */
int VESAcopy256(unsigned dx, unsigned dy,
unsigned sx, unsigned sy,
unsigned sdx, unsigned sdy)
{
char *temp;
int i,g, b, direction;
long t;
/* determine if the source is less than the destination, and overlaps */
if ( (sy < dy) && (sy+sdy > dy) && (sx+sdx > dx) && (dx+sdx > sx) )
direction=-1;
else
direction=1;
t=(long)sdx*sdy;
if (t < 16385) {
g=sdy;
} else {
g=16384/sdx;
t=g*sdx;
}
if ( (temp=(char *)malloc((unsigned)t)) == NULL) {
return(0);
}
if (vgadebug) {
fprintf(vgadebug,
"\nVESAcopy256(dx=%u, dy=%u, sx=%u, sy=%u, sdx=%u, sdy=%u)\n",
dx,dy,sx,sy,sdx,sdy);
fprintf(vgadebug," temp=%Fp, _s_s=%Fp, _s_w=%u, g=%u, direction=%i"
", core=%lu\n",
temp, _screen_start, _screen_width, g, direction,coreleft());
fflush(vgadebug);
}
if ( direction > 0 ) {
for (i=sy; i<sy+sdy; i+=g, dy+=g) {
b=(( (sy+sdy-i) < g ) ? (sy+sdy-i) : g );
VESAcapt256(temp, sdx, g, 0, 0, sx, i, sdx, b, 1);
VESAdisp256(dx, dy, temp, sdx, g, 0, 0, sdx, b, 1);
}
} else {
i=(sy+sdy); b=g; dy+=sdy;
while ( i > sy ) {
if ( sy+b > i ) {
b=i-sy; i=sy; dy-=b;
} else {
i-=g; dy-=g;
}
VESAcapt256(temp, sdx, g, 0, 0, sx, i, sdx, b, -1);
VESAdisp256(dx, dy, temp, sdx, g, 0, 0, sdx, b, -1);
}
}
free(temp);
return(1);
}
/* System memory to video copy */
int VESAdisp256(unsigned dx, unsigned dy,
char *s, unsigned sw, unsigned sl,
unsigned sx, unsigned sy,
unsigned sdx, unsigned sdy, int direction)
{
char *src;
char *dest;
int tempdx;
src=(char *)normalize(s + sy*sw + sx);
VESAsetpage(VESAwhat_page(dy, dx));
dest=(char *)normalize(_screen_start + VESAwhat_offset(dy,dx));
if (vgadebug) {
fprintf(vgadebug,"\nVESAdisp256(dx=%u, %u, s=%Fp,"
" sw=%u, %u, sx=%u, %u, sdx=%u, sdy=%u, "
"direction=%u)\n",
dx,dy,s,sw,sl,sx,sy,sdx,sdy,direction);
fflush(vgadebug);
}
while (sdy>0) {
while ((Vnext_break_row != dy) && (sdy>0)){
/* while we're not on a break row and we've still got work ... */
memcpy(dest, src, sdx);
dy++; sdy--;
dest=dest+_screen_width; /* don't need to normalize dest */
src=(char *)normalize(src+sw);
}
if ((sdy>0) && (Vnext_break_row == dy)) {
/* if we've still got lines to do and we're on a break row ... */
/* Vnext_break_col is the first byte in the next page */
tempdx=Vnext_break_col - dx; /* number of bytes on this page */
if ( tempdx < 1 ) { /* no bytes to output on this page */
VESAsetpage(vesapage+1);
dest=(char *)normalize (_screen_start + VESAwhat_offset(dy,dx) );
memcpy(dest, src, sdx);
dy++; sdy--;
if (sdy) src=(char *)normalize(src + sw);
continue;
}
if ( sdx > tempdx ) { /* split page */
memcpy(dest, src, tempdx);
VESAsetpage(vesapage+1);
dest=(char *)normalize
(_screen_start + VESAwhat_offset(dy,dx+tempdx) );
memcpy(dest, src+tempdx, (sdx-tempdx));
} else { /* then sdx <= tempdx */
memcpy(dest, src, sdx);
VESAsetpage(vesapage+1);
}
dy++; sdy--;
dest=(char *)normalize(_screen_start + VESAwhat_offset(dy,dx));
}
if (sdy) src=(char *)normalize(src + sw);
}
return(1);
}
/* Video to System memory copy */
int VESAcapt256(char *d, unsigned dw, unsigned dl,
unsigned dx, unsigned dy,
unsigned sx, unsigned sy,
unsigned sdx, unsigned sdy, int direction)
{
char *src;
char *dest;
int tempdx;
dest=(char *)normalize(d + dy*dw + dx);
VESAsetpage(VESAwhat_page(sy, sx));
src=(char *)normalize(_screen_start + VESAwhat_offset(sy,sx));
if (vgadebug) {
fprintf(vgadebug,"\nVESAcapt256(d=%Fp, dw=%u, %u, dx=%u, %u, sx=%u, %u,"
" sdx=%u, sdy=%u, direction=%u)\n",
d, dw, dl, dx,dy,sx,sy,sdx,sdy,direction);
}
while (sdy) {
while ((Vnext_break_row != sy)&&(sdy>0)) {
memcpy(dest, src, sdx);
sy++; sdy--;
src=(char *)normalize(src+_screen_width);
dest=(char *)normalize(dest+dw);
}
if ( (sdy>0) && (Vnext_break_row == sy)) {
tempdx=Vnext_break_col - sx; /* number of bytes on this page */
if ( tempdx < 1 ) { /* if no bytes on this page */
VESAsetpage(vesapage+1);
src=(char *)normalize
(_screen_start + VESAwhat_offset(sy,sx) );
memcpy(dest, src, sdx);
sy++; sdy--;
src=(char *)normalize(src+_screen_width);
if (sdy) dest=(char *)normalize(dest + dw);
continue;
}
if ( sdx > tempdx ) { /* split page */
memcpy(dest, src, tempdx);
VESAsetpage(vesapage+1);
src=(char *)normalize
(_screen_start + VESAwhat_offset(sy,sx+tempdx) );
memcpy((dest+tempdx), src, (sdx-tempdx));
} else { /* all on this page */
memcpy(dest, src, sdx);
VESAsetpage(vesapage+1);
}
sy++; sdy--;
src=(char *)normalize(_screen_start + VESAwhat_offset(sy,sx));
}
if (sdy) dest=(char *)normalize(dest + dw);
}
return(1);
}